/**
 *
    算法描述：二维数组上的移动问题，可以通过方向和坐标来模拟搞定
    解决所需数据结构+算法：
**/
#include<iostream>
#include<cstring>
using namespace std;

// 行和列的方向变化
int dx[4] = {0, 1, 0,-1};
int dy[4] = {1, 0,-1, 0};
int a[10][10];  // 存放地图

int main() {
    memset(a, 0, sizeof(a));
    // 变量的定义和初始化（注意初始化的值）
    int n, step = 1, d = 2;
    int x = 1, y = 0, xx, yy;
    cin >> n;
    while(step <= n*n) { // 循环条件
        xx = x + dx[d];
        yy = y + dy[d];
        /*
        满足两个条件即可走下一步：
        1. 不越界
        2. 未赋值

        否则改方向。只有上下左右4个方向，因此需要 %4
        */
        if(xx>=1 && xx<=n && yy>=1 && yy<=n && !a[xx][yy]) {
            x = xx, y = yy;
            a[x][y] = step++;
        } else  d = (d + 1) % 4;
    }

    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++)
            // c语言输出格式，3个整形占位符
            printf("%3d", a[i][j]);
        cout << endl;
    }

    return 0;
}